什么情况下需要使用processEvents函数
当我们在同一个线程中同时处理界面以及一些非常耗时的操作时,可能会出现界面无法响应,处于”假死“状态。通常解决这种现象的一种方法就是使用多线程,主线程专门负责界面,另开线程处理耗时的操作。在Qt中还有一种方法就是在耗时操作执行的过程中频繁调用QApplication::processEvents()
函数,该函数的作用是让程序处理那些还没有处理的事件,然后再把使用权返回给调用者。
怎么使用processEvents函数
下面举个简单的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| bool MyApp::writeFile(const QString &filename) { QFile file(filename); ... QApplication::setOverrideCursor(Qt::WaitCursor); QProgressDialog progress; progress.setWindowTitle(tableData->sNameCH); progress.setLabelText(QStringLiteral("数据保存中,请稍候...")); progress.setCancelButtonText("取消"); progress.setRange(0,rowCount ); progress.setModal(true); for(int r = 0; r != rowCount; ++r) { progress.setValue(row); if(progress.wasCanceled) { file.remov(); return false; } for(int c = 0; c != colCount; ++c) { out << table(r,c); qApp.processEvents(); } } QApplication::restoreOverrideCursor(); }
|
参考资料
本文参考自文章。